#pragma once

enum shell_subsystem {
    SHELL_SKIP,
    SHELL_TX,
    SHELL_HAYSTACK
};

enum base_subsystem {
    BASE_NONE,
    BASE_FULL,
    BASE_DRV
};

enum base_api {
    BASE_API_3
};

struct game_data {
    enum shell_subsystem shell_sub;
    union {
        struct {
            const wchar_t *assembly_name;
            const char *txs_section_name;
            const char *tvm_section_name;
        } tx;
        struct {
            void *(*get_entry_point)();
        } haystack;
    } shell_args;

    enum base_subsystem base_sub;
    union {
        struct {
            const wchar_t *base_name;
            enum base_api api;
        } full;
        struct {
            const wchar_t *drv_name;
        } drv;
    } base_args;
};

void game_detect(struct game_data *buf);

void *game_generate_unity_loader();
void *game_find_msvc_entry_point();

void hi3_fill_data(struct game_data *buf);
void hsr_fill_data(struct game_data *buf);
void wuwa_fill_data(struct game_data *buf);
